/***********************************************************************************
 * 文件名： umi_static_config.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		通用存储器接口组件 Universal memory interface(UMI)。提供通用的存储器访问接口：
 *  Umi_Write、Umi_Read.  目前比较适用于操作MCU片上FLASH、小容量串行FLASH。
 * 修改记录：
 * 	2021/11/16: 初版。 刘言。 
***********************************************************************************/
#ifndef _UMI_STATIC_CONFIG_H_
#define _UMI_STATIC_CONFIG_H_

#include "mcu_top.h"

// 定义地址长度，可选 8 16 32 。
// 更小的长度对于8位机来说可以一定程度节省资源，建议32位机统一定义为32.
#define _UMI_ADDR_SIZE      32

// 定义起始地址
#define _UMI_ADDR_BASE      0x11010000

// 定义存储器尺寸（字节数），起始地址和存储器尺寸决定了UMI可操作的范围，超出范围将会报错并不会进行写入操作。
#define _UMI_SIZE           (1*1024)

// 页尺寸。页在这里表示一次擦除操作的最小单元。
#define _UMI_PAGE_SIZE      4096

// 内存申请方式(用于缓存整页数据，需求量 = _UMI_PAGE_SIZE)
// 0: 局部变量（栈空间），未使用RTOS推荐，注意栈尺寸
// 1: 申请堆空间，需要定义申请内存API，RTOS环境推荐
#define _UMI_USE_MRM        1

// 本组件提供的API的地址类型。0：绝对地址，1：相对地址（地址参数自动加上 _UMI_ADDR_BASE ）。
#define _UMI_ADDR_TYPE      1



// 需要引用的外部API定义。

#define _Umi_MemoryInit()   //OcpFlash_Init()

// 写入一整页数据，注意 page_addr 是页首数据绝对地址，不需要做地址范围检查。
// #define _Umi_MemoryWritePage(page_addr, buff)   //OcpFlash_WritePage(page_addr, buff)
STATIC_FORCE_IN_LINE void _Umi_MemoryWritePage(u32 page_addr, const u8 *buff)
{
    HalFlashErase(page_addr >> 12);
    HalFlashWrite(page_addr,(u8 *)buff, _UMI_PAGE_SIZE);
}

// 注意 addr 是绝对地址，不需要做地址范围检查，不需要通过UMI读取时可以定义为空。
// #define _Umi_MemoryRead(addr, buff, length)     //OcpFlash_Read(buff, addr, length)
STATIC_FORCE_IN_LINE void _Umi_MemoryRead(u32 addr, u8 *buff, u32 length)
{
    memcpy(buff, (const void *)addr, length);
}

#if _UMI_USE_MRM == 1
#define _Umi_Alloc(size_t_size)             malloc(size_t_size)
#define _Umi_Free(void_ptr)                 free(void_ptr)        
#endif

#endif
